/**
 * File Name   : ProductInsurService.java
 * Description : 
 */
package com.hh.admin.product.insurance.service;

import java.sql.SQLException;

import org.apache.log4j.Logger;

import com.hh.admin.product.insurance.form.ParamProductInsurBean;
import com.hh.admin.product.insurance.form.ProductInsurForm;
import com.hh.admin.product.insurance.form.ResultProductInsurBean;
import com.hh.common.ibatis.dao.IQueryDao;
import com.hh.common.ibatis.dao.IUpdateDao;
import com.hh.portal.products.form.ParamPortalProductsBean;

/**
 * 保险基金产品管理Service
 * @author 冯昌硕
 * @create 2013-1-9 下午11:39:39
 * @modify 2013-02-02 删除方法getProductInsurInfoList(ProductInsurForm form)，改用公共Service提供的方法
 */
public class ProductInsurService {
    
    private static final Logger log = Logger.getLogger(ProductInsurService.class);

    private IQueryDao queryDao;

    private IUpdateDao updateDao;
    
    /**
     * 根据主键删除指定记录
     * @param id 产品ID
     * @return
     * @throws SQLException
     * @create 2013-1-10 下午10:26:08
     * @modify 2013-02-15 17:28 删除单条记录时同时删除common_product表相应记录
     */
    public int deleteOneInsurProductInfo(int id, int productTypeId) throws SQLException {
        int delRs = -1;
        
        try {
            updateDao.startTransaction();
            delRs = updateDao.delete("productinsur.deleteInsurProductInfo", id);
            log.debug("[deleteOneInsurProductInfo] contentId=["+id+"] productTypeId=[" + productTypeId + "] [productinsur.deleteInsurProductInfo删除影响记录行数[" + delRs+ "]]");
            
            ParamPortalProductsBean paramBean = new ParamPortalProductsBean();
            paramBean.setProductContentId(id);
            paramBean.setProductTypeId(productTypeId);
            int delRs2 = updateDao.delete("commonProduct.deleteCommonProduct", paramBean);
            log.debug("[deleteOneInsurProductInfo] contentId=["+id+"] productTypeId=[" + productTypeId + "] [commonProduct.deleteCommonProduct删除影响记录行数[" + delRs2 + "]]");
            
            updateDao.commitTransaction();
        } finally {
            updateDao.endTransaction();
        }
        
        //return updateDao.delete("productinsur.deleteInsurProductInfo", id);
        return delRs;
    }
    
    /**
     * 批量删除产品记录
     * @param ids 要删除的产品ID
     * @return
     * @throws SQLException
     * @create 2013-1-10 下午10:28:46
     * @modify 2013-02-15 17:34 删除批量记录时同时删除common_product表相应记录
     */
    public int deleteManyProductInfo(Integer[] ids, int productTypeId) throws SQLException {
        int result = -1;
        
        try {
            updateDao.startTransaction();
            updateDao.startBatch();
            
            if((ids == null) || (ids.length <= 0)) {
                log.info("批量删除[productinsur.deleteInsurProductInfo]参数数组为空，不作处理");
                return result;
            }
            
            // 批处理删除内容表记录
            for(Object paramObj : ids) {
                updateDao.delete("productinsur.deleteInsurProductInfo", paramObj);
            }
            
            // 批处理删除公共内容表记录
            log.debug("[deleteManyProductInfo]批量删除公共内容表记录，产品类型[" + productTypeId + "]");
            for(Integer paramObj : ids) {
                ParamPortalProductsBean paramBean = new ParamPortalProductsBean();
                paramBean.setProductContentId(paramObj);
                paramBean.setProductTypeId(productTypeId);
                updateDao.delete("commonProduct.deleteCommonProduct", paramBean);
            }
            
            result = updateDao.executeBatch();
            
            updateDao.commitTransaction();
        } catch(SQLException e) {
            log.error("[deleteManyProductInfo] 批处理异常： " + e.toString());
            throw e;
        } finally {
            updateDao.endTransaction();
        }
        
        //return updateDao.batchDelete("productinsur.deleteInsurProductInfo", ids);
        return result;
    }
    
    /**
     * 添加产品记录
     * @param form
     * @return
     * @throws SQLException
     * @create 2013-1-10 下午10:45:10
     * @modify 2013-02-15 16:55 添加记录时同时写入common_product表（事务控制）
     */
    public int insertInsurProduct(ProductInsurForm form) throws SQLException {
        ParamProductInsurBean paramBean = new ParamProductInsurBean();
        paramBean.setProductName(form.getProductName());       // 产品名称
        paramBean.setCompanyName(form.getCompanyName());       // 公司名称
        paramBean.setInsuranceType(form.getInsuranceType());   // 所属分类
        paramBean.setPremium(form.getPremium());               // 保费
        paramBean.setTimeLimit(form.getTimeLimit());           // 保障期限
        
        paramBean.setStatus(form.getStatus());                 // 内容状态（0-不可用；1-可用）
        paramBean.setCreateUser(form.getCreateUser());         // 内容创建人
        
        Integer productInserAddRs = -1;
        try {
            updateDao.startTransaction();
            productInserAddRs = (Integer) updateDao.insert("productinsur.insertContent", paramBean);
            log.debug("[insertInsurProduct] producttrust.insertContent result = [" + productInserAddRs + "]");
            
            ParamPortalProductsBean portalParam = new ParamPortalProductsBean();
            portalParam.setProductTypeId(form.getProductTypeId()); // 产品类型ID,参照表product_type的id字段
            portalParam.setStatus(form.getStatus());               // 内容状态(0-草稿;1-发布)
            portalParam.setProductName(form.getProductName());     // 产品名称
            portalParam.setProductContentId(productInserAddRs);    // 产品记录内容ID
            
            int portalInsertRs = (Integer) updateDao.insert("commonProduct.insertCommonProduct", portalParam);
            log.debug("[insertInsurProduct] commonProduct.insertCommonProduct result = [" + portalInsertRs + "]");
            
            updateDao.commitTransaction();
        } finally {
            updateDao.endTransaction();
        }
        
        return productInserAddRs;
    }
    
    /**
     * 根据记录ID获取信托理财产品详情
     * @param id
     * @return
     * @throws ClassCastException
     * @throws SQLException
     * @create 2013-1-10 下午10:55:29
     */
    public ResultProductInsurBean getInsurProductDetail(int id) throws ClassCastException, SQLException {
        return queryDao.queryForObject("productinsur.selInsurProductInfo", id, ResultProductInsurBean.class);
    }
    
    /**
     * 更新记录
     * @param form
     * @return
     * @throws SQLException
     * @create 2013-1-10 下午11:16:14
     * @modify 2013-02-15 16:55 更新时同时更新common_product表相应字段
     */
    public int updateInsurProductInfo(ProductInsurForm form) throws SQLException {
        ParamProductInsurBean paramBean = new ParamProductInsurBean();
        paramBean.setProductName(form.getProductName());       // 产品名称
        paramBean.setCompanyName(form.getCompanyName());       // 公司名称
        paramBean.setInsuranceType(form.getInsuranceType());   // 所属分类
        paramBean.setPremium(form.getPremium());               // 保费
        paramBean.setTimeLimit(form.getTimeLimit());           // 保障期限
        paramBean.setStatus(form.getStatus());                 // 内容状态（0-不可用；1-可用）
        paramBean.setId(form.getId());
        
        int result = -1;
        try {
            updateDao.startTransaction();
            result = updateDao.update("productinsur.updateInsurProduct", paramBean);
            
            ParamPortalProductsBean param = new ParamPortalProductsBean();
            param.setProductName(form.getProductName());     // 产品名称
            param.setStatus(form.getStatus());               // 内容状态：0-草稿；1-发布
            param.setProductTypeId(form.getProductTypeId()); // 产品类型ID,参照表product_type的id字段
            param.setProductContentId(form.getId());         // 产品记录内容ID
            updateDao.update("commonProduct.updateCommonProduct", param);
            
            updateDao.commitTransaction();
        } finally {
            updateDao.endTransaction();
        }
        
        return result;
    }

    public IQueryDao getQueryDao() {
        return queryDao;
    }

    public void setQueryDao(IQueryDao queryDao) {
        this.queryDao = queryDao;
    }

    public IUpdateDao getUpdateDao() {
        return updateDao;
    }

    public void setUpdateDao(IUpdateDao updateDao) {
        this.updateDao = updateDao;
    }
    
    
}
